#pragma once
#include "polaczenie.h"
#include "stdafx.h"
using namespace std;
class wezel
{
//private:
public:
	wezel *przodek;
	wezel *nastepny;
	wezel *poprzedni;
	wezel *pot_pierwszy;
	wezel *pot_ostatni;
	polaczenie *strzalka;
	string *etykieta;
	int wysokosc;
	int ilosc_potomkow;
	int X;
	int Y;
//public:

	
	/// konstruktor
	wezel();
	wezel(string *s);
	
	/// destruktor
	~wezel(void);
	
	///zwraca przodka (ojca)
	wezel *pobierz_przodek();
	
	///ustawia nowego przodka (ojca) na w
	void zmien_przodek(wezel *w);
	
	///zwraca "mlodszego brata"
	wezel *pobierz_nastepny();
	
	///ustawia "mlodszego brata" na w
	void zmien_nastepny(wezel *w);
	
	///zwraca "starszego brata"
	wezel *pobierz_poprzedni();
	
	///ustawia "starszego brata" na w
	void zmien_poprzedni(wezel *w);
	
	///zwraca "najstarszego syna"
	wezel *pobierz_pot_pierwszy();
	
	///ustawia "najstarszego syna" na w
	void zmien_pot_pierwszy(wezel *w);

	///zwraca "najmlodszego syna"
	wezel *pobierz_pot_ostatni();

	///ustawia "najmlodszego syna" na w
	void zmien_pot_ostatni(wezel *w);

	///pobiera wysokosc
	int pobierz_wysokosc();

	///ustawia wysokosc na h
	void zmien_wysokosc(int h);

	///zwraca ilosc synow
	int pobierz_ilosc_potomkow();

	///zmienia ilosc synow na n
	void zmien_ilosc_potomkow(int n);
	
	///aktualizuje wysokosc
	void aktualizacja_wys();
	
	/** dodaje syna
		jezeli w==NULL to tworzy nowy wezel
		w przeciwnym wypadku ustawia w jako syna
		
		jezeli brat==NULL to ustawia nowego syna na koncu listy (jako "najmlodszego syna")
		w przeciwnym wypadku ustawia nowego syna o jedno miejsce wyzej niz brat (nowy wezel staje sie starszym bratem wezla brat)
	**/
	void dodaj_syna(wezel *w=NULL,wezel *brat=NULL, string *s=NULL);

	/**dodaje "starszego brata"
		jezeli wezel==NULL to tworzy nowy wezel i ustawia go jako starszy brat
	**/
	void dodaj_brata(wezel *w=NULL);

	/** usuwa wezel razem z calym jego poddrzewem i zwraca wskaznik na niego
		
		jezeli syn==NULL to usuwany jest wezel "w ktorym jestesmy"
		w przeciwnym wypadku usuwany jest wezel syn
	**/
	wezel *usun(wezel *syn=NULL);

	///wypisuje drzewo (w formie testowej)
	void wypisz();

	bool przenies_w_gore(wezel *w);
	bool przenies_w_dol(wezel *w);
	bool przenies_w_lewo(wezel *w);
	bool przenies_w_prawo(wezel *w);
};
